Esempio n. 1
0
void mrgss_renderer_draw(mrb_state* mrb, mrb_value window) {
    mrb_value drawables;
    mrb_bool sprite_visible;
    mrgss_screen *swindow = DATA_PTR(window);
    mrgss_renderer *renderer = swindow->renderer;
    drawables = mrgss_iv_get(mrb, window, "drawables");
    mrgss_renderer_wait_for_gl_lock();
    mrgss_renderer_update_sprites_order(mrb, drawables, renderer);
    //mrgss_renderer_sync_sprite_changes(mrb, drawables, renderer);
    for(int i = 0; i < RARRAY_LEN(drawables); i++){
        mrb_value rsprite = mrb_ary_entry(drawables, i);
        mrgss_sprite *sprite = DATA_PTR(rsprite);
        sprite_visible = mrb_bool(mrgss_iv_get(mrb, rsprite, "@visible"));
        if(!sprite_visible || sprite->opacity <= 0) {
            continue;
        }
        if(sprite->dirty) {
            build_sprite_transforms_matrix(mrb, rsprite);
            memcpy(&(renderer->persistentShaderBuffer[i * 16]), sprite->transforms.mat, sizeof(GLfloat) * 16);    
            sprite->dirty = 0;
        }
        if(sprite->newPos) {
            update_sprite_position(mrb, rsprite);
            memcpy(&(renderer->persistentBuffer[i * 4]), sprite->vertices, sizeof(sprite->vertices));    
            sprite->newPos = 0;
        }
    }
    glUniform1f(glGetUniformLocation(renderer->shader, "opacity"), 1.0);
    //glDrawArraysInstanced(GL_QUADS, 0, RARRAY_LEN(drawables) * 4, RARRAY_LEN(drawables) );
    glDrawArrays(GL_QUADS, 0, RARRAY_LEN(drawables) * 4);
    mrgss_renderer_lock_gl_buffer(); 
}
Esempio n. 2
0
mrb_value mrb_serialport_open(mrb_state *mrb, mrb_value self) {
  int fd;
  mrb_value mrb_portname = IV_GET("@port_name");
  mrb_value mrb_baud = IV_GET("@baud");
  mrb_value mrb_blocking = IV_GET("@blocking");

  const char *portname = mrb_string_value_cstr(mrb, &mrb_portname);
  unsigned int baud = mrb_fixnum(mrb_baud);

  fd = open(portname, O_RDWR | O_NOCTTY | O_SYNC);
  if (fd < 0) {
    update_error(mrb, self);
    mrb_raise(mrb, E_RUNTIME_ERROR, strerror(errno));
  }
  if (!isatty(fd)) {
    update_error(mrb, self);
    mrb_raise(mrb, E_RUNTIME_ERROR, strerror(errno));
  }
  if (set_interface_attribs(fd, baud, 0)) {
    update_error(mrb, self);
    mrb_raise(mrb, E_RUNTIME_ERROR, strerror(errno));
  }
  if (set_blocking(fd, mrb_bool(mrb_blocking) ? 1 : 0) != 0) {
    IV_SET("@error", mrb_str_new_cstr(mrb, "Could not set blocking behavior"));
    mrb_raise(mrb, E_RUNTIME_ERROR, "Could not set blocking behavior");
  }
  IV_SET("@fd", mrb_fixnum_value(fd));
  return self;
}
Ref* to_ref_value(mrb_state* mrb, mrb_value val)
{
    switch (val.tt) {
        case mrb_vtype::MRB_TT_FIXNUM:
        {
            mrb_int v = mrb_fixnum(val);
            return Integer::create((int)v);
        }
        case mrb_vtype::MRB_TT_FLOAT:
        {
            mrb_float v = mrb_float(val);
            return Double::create((double)v);
        }
        case mrb_vtype::MRB_TT_FALSE:
        case mrb_vtype::MRB_TT_TRUE:
        {
            return Bool::create(mrb_bool(val));
        }
        case mrb_vtype::MRB_TT_STRING:
        {
            char* str = mrb_str_to_cstr(mrb, val);
            return String::createWithFormat("%s", str);
        }
        case mrb_vtype::MRB_TT_SYMBOL:
        {
            mrb_sym sym = mrb_symbol(val);
            const char* str = mrb_sym2name(mrb, sym);
            return String::createWithFormat("%s", str);
        }
        case mrb_vtype::MRB_TT_RANGE:
        {
            // TODO: range
            /*
             mrb_int beg;
             mrb_int len;
             mrb_range_beg_len(mrb, val, &beg, &len, 0);
             */
            break;
        }
        case mrb_vtype::MRB_TT_OBJECT:
        {
            // TODO: ruby object
            break;
        }
        case mrb_vtype::MRB_TT_DATA:
        {
            Ref* ref =static_cast<Ref*>(mrb_get_datatype(mrb, val, &ruby_cocos2dx_Ref_type));
            return ref;
        }
        case mrb_vtype::MRB_TT_UNDEF:
            break;
        default:
            CCASSERT(false, "not supported type");
    }
    return nullptr;
}
Esempio n. 4
0
mrb_value
mrb_range_eq(mrb_state *mrb, mrb_value range)
{
  struct RRange *rr;
  struct RRange *ro;
  mrb_value obj;

  mrb_get_args(mrb, "o", &obj);

  if (mrb_obj_equal(mrb, range, obj)) return mrb_true_value();
  if (!mrb_obj_is_instance_of(mrb, obj, mrb_obj_class(mrb, range))) { /* same class? */
    return mrb_false_value();
  }

  rr = mrb_range_ptr(range);
  ro = mrb_range_ptr(obj);
  if (!mrb_bool(mrb_funcall(mrb, rr->edges->beg, "==", 1, ro->edges->beg)) ||
      !mrb_bool(mrb_funcall(mrb, rr->edges->end, "==", 1, ro->edges->end)) ||
      rr->excl != ro->excl) {
    return mrb_false_value();
  }
  return mrb_true_value();
}
Esempio n. 5
0
mrb_value
mrb_f_syslog_close(mrb_state *mrb, mrb_value self)
{
  mrb_value opened;

  opened = mrb_cv_get(mrb, self, mrb_intern_lit(mrb, "@opened"));
  if (! mrb_bool(opened)) {
    mrb_raise(mrb, E_RUNTIME_ERROR, "syslog not opened");
  }

  closelog();
  reset_vars(mrb, self);

  return mrb_nil_value();
}
Esempio n. 6
0
mrb_value
mrb_f_syslog_open(mrb_state *mrb, mrb_value self)
{
  mrb_value ident, opened;
  mrb_int facility, options;

  opened = mrb_cv_get(mrb, self, mrb_intern_lit(mrb, "@opened"));
  if (mrb_bool(opened)) {
    mrb_raise(mrb, E_RUNTIME_ERROR, "syslog already open");
  }

  ident    = mrb_gv_get(mrb, mrb_intern_lit(mrb, "$0"));
  options  = LOG_PID | LOG_CONS;
  facility = LOG_USER;
  mrb_get_args(mrb, "|Sii", &ident, &options, &facility);

  ident = mrb_check_string_type(mrb, ident);

  /*
   * We assume mrb_str_new() returns a *not-shared* string with a NUL
   * character at the end of the string.
   */
  ident = mrb_str_new(mrb, RSTRING_PTR(ident), RSTRING_LEN(ident));

  /*
   * We must set "ident" to a class variable before calling openlog(3).
   * Otherwise, syslog(3) may refer to some unallocated (GC'ed out) memory
   * area when mrb_cv_set() fails.  Note that some openlog(3) implementations
   * store "ident" argument as is (not strdup(3)ed!).
   * http://man7.org/linux/man-pages/man3/syslog.3.html#NOTES
   *
   * And we make class variable "ident" inaccessible from Ruby world
   * for safety.
   */
  mrb_cv_set(mrb, self, mrb_intern_lit(mrb, "ident"), ident);

  openlog(RSTRING_PTR(ident), options, facility);

  mrb_cv_set(mrb, self, mrb_intern_lit(mrb, "@opened"), mrb_true_value());
  mrb_cv_set(mrb, self, mrb_intern_lit(mrb, "@options"), mrb_fixnum_value(options));
  mrb_cv_set(mrb, self, mrb_intern_lit(mrb, "@facility"), mrb_fixnum_value(facility));

  return self;
}
Esempio n. 7
0
/*
 *  call-seq:
 *     obj.respond_to?(symbol, include_private=false) -> true or false
 *
 *  Returns +true+ if _obj_ responds to the given
 *  method. Private methods are included in the search only if the
 *  optional second parameter evaluates to +true+.
 *
 *  If the method is not implemented,
 *  as Process.fork on Windows, File.lchmod on GNU/Linux, etc.,
 *  false is returned.
 *
 *  If the method is not defined, <code>respond_to_missing?</code>
 *  method is called and the result is returned.
 */
static mrb_value
obj_respond_to(mrb_state *mrb, mrb_value self)
{
  mrb_sym id, rtm_id;
  mrb_bool priv = FALSE, respond_to_p;

  mrb_get_args(mrb, "n|b", &id, &priv);
  respond_to_p = basic_obj_respond_to(mrb, self, id, !priv);
  if (!respond_to_p) {
    rtm_id = mrb_intern_lit(mrb, "respond_to_missing?");
    if (basic_obj_respond_to(mrb, self, rtm_id, !priv)) {
      mrb_value args[2], v;
      args[0] = mrb_symbol_value(id);
      args[1] = mrb_bool_value(priv);
      v = mrb_funcall_argv(mrb, self, rtm_id, 2, args);
      return mrb_bool_value(mrb_bool(v));
    }
  }
  return mrb_bool_value(respond_to_p);
}
bool rubyval_to_ccvalue(mrb_state* mrb, mrb_value arg, cocos2d::Value* ret, const char* funcName)
{
    switch (arg.tt) {
        case mrb_vtype::MRB_TT_ARRAY:
        {
            ValueVector arrVal;
            if (! rubyval_to_ccvaluevector(mrb, arg, &arrVal)) {
                return false;
            }
            *ret = Value(arrVal);
            break;
        }
        case mrb_vtype::MRB_TT_HASH:
        {
            ValueMap dictVal;
            if (! rubyval_to_ccvaluemap(mrb, arg, &dictVal)) {
                return false;
            }
            *ret = Value(dictVal);
            break;
        }
        case mrb_vtype::MRB_TT_RANGE:
        {
            // TODO
            return false;
            break;
        }
        case mrb_vtype::MRB_TT_FIXNUM:
        {
            mrb_int val = mrb_fixnum(arg);
            *ret = Value((int)val);
            break;
        }
        case mrb_vtype::MRB_TT_FLOAT:
        {
            mrb_float val = mrb_float(arg);
            *ret = Value((float)val);
            break;
        }
        case mrb_vtype::MRB_TT_TRUE:
        case mrb_vtype::MRB_TT_FALSE:
        {
            bool val = mrb_bool(arg);
            *ret = Value(val);
            break;
        }
        case mrb_vtype::MRB_TT_STRING:
        {
            char* val = mrb_str_to_cstr(mrb, arg);
            *ret = Value(val);
            break;
        }
        case mrb_vtype::MRB_TT_SYMBOL:
        {
            mrb_sym sym = mrb_symbol(arg);
            const char* val = mrb_sym2name(mrb, sym);
            *ret = Value(val);
            break;
        }
        default:
            return false;
    }
    return true;
}
Esempio n. 9
0
static mrb_value ngx_mrb_add_listener(mrb_state *mrb, mrb_value self)
{
  // ref: http/ngx_http_core_module.c ngx_http_core_listen
  ngx_http_mruby_srv_conf_t *mscf = mrb->ud;
  ngx_http_core_srv_conf_t *cscf = mscf->cscf;
  ngx_conf_t *cf = mscf->cf;
  ngx_str_t addr;
  ngx_url_t u;
  ngx_http_listen_opt_t lsopt;
  mrb_value listener, address;

  mrb_get_args(mrb, "H", &listener);
  address = mrb_hash_get(mrb, listener, mrb_check_intern_cstr(mrb, "address"));
  addr.data = (u_char *)RSTRING_PTR(address);
  addr.len = RSTRING_LEN(address);

  ngx_memzero(&u, sizeof(ngx_url_t));
  u.url = addr;
  u.listen = 1;
  u.default_port = 80;
  cscf->listen = 1;

  if (ngx_parse_url(cf->pool, &u) != NGX_OK) {
    if (u.err) {
      ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%s in \"%V\" of the \"listen\" directive via mruby", u.err, &u.url);
    }

    mrb_raise(mrb, E_RUNTIME_ERROR, "ngx_mrb_add_listener ngx_parse_url failed");
  }

  ngx_memzero(&lsopt, sizeof(ngx_http_listen_opt_t));
  ngx_memcpy(&lsopt.sockaddr.sockaddr, &u.sockaddr, u.socklen);

  lsopt.socklen = u.socklen;
  lsopt.backlog = NGX_LISTEN_BACKLOG;
  lsopt.rcvbuf = -1;
  lsopt.sndbuf = -1;
#if (NGX_HAVE_SETFIB)
  lsopt.setfib = -1;
#endif
#if (NGX_HAVE_TCP_FASTOPEN)
  lsopt.fastopen = -1;
#endif
  lsopt.wildcard = u.wildcard;
#if (NGX_HAVE_INET6)
  lsopt.ipv6only = 1;
#endif
  if (mrb_bool(mrb_hash_get(mrb, listener, mrb_check_intern_cstr(mrb, "ssl")))) {
#if (NGX_HTTP_SSL)
    lsopt.ssl = 1;
#else
    mrb_raise(mrb, E_RUNTIME_ERROR, "the ssl symbol requires ngx_http_ssl_module");
#endif
  }

  if (mrb_bool(mrb_hash_get(mrb, listener, mrb_check_intern_cstr(mrb, "http2")))) {
#if (NGX_HTTP_V2)
    lsopt.http2 = 1;
#else
    mrb_raise(mrb, E_RUNTIME_ERROR, "the http2 symbol requires ngx_http_http2_module");
#endif
  }

  (void)ngx_sock_ntop(&lsopt.sockaddr.sockaddr, lsopt.socklen, lsopt.addr, NGX_SOCKADDR_STRLEN, 1);
  if (ngx_http_add_listen(cf, cscf, &lsopt) == NGX_OK) {
    ngx_conf_log_error(NGX_LOG_INFO, cf, 0, "add listener %V via mruby", &addr);
    return mrb_true_value();
  }

  mrb_raise(mrb, E_RUNTIME_ERROR, "ngx_mrb_add_listener ngx_http_add_listen failed");
}