Method: Nuklear::Renderer::OpenGL2#nk_convert

Defined in:
ext/nuklear_renderer_opengl2/nuklear_renderer_opengl2.c

#nk_convert(rcontext) ⇒ Object



122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# File 'ext/nuklear_renderer_opengl2/nuklear_renderer_opengl2.c', line 122

VALUE renderer_nk_convert_gl(VALUE self, VALUE rcontext) {
  VALUE result = rb_call_super(1, &rcontext);
  VALUE rconfig = rb_funcall(self, rb_intern("convert_config"), 0);
  GLsizei vs = (GLsizei) FIX2INT(rb_hash_aref(rconfig, ID2SYM(rb_intern("vertex_size"))));

  size_t vp, vt, vc; // vertex struct offsets
  VALUE rvertex_layout = rb_hash_aref(rconfig, ID2SYM(rb_intern("vertex_layout")));
  for (int i = 0; i < RARRAY_LEN(rvertex_layout); i++) {
    VALUE rlayout = RARRAY_AREF(rvertex_layout, i);
    int offset = FIX2INT(RARRAY_AREF(rlayout, 2));
    enum nk_draw_vertex_layout_attribute attr = rb2nk_attribute(RARRAY_AREF(rlayout, 0));
    switch(attr) {
      case NK_VERTEX_POSITION: vp = (size_t) offset; break;
      case NK_VERTEX_COLOR:    vc = (size_t) offset; break;
      case NK_VERTEX_TEXCOORD: vt = (size_t) offset; break;
      default: break;
    }
  }

  /* setup vertex buffer pointer */
  struct nk_buffer *vertex_buffer = NULL;
  Data_Get_Struct(rb_funcall(self, rb_intern("vertices"), 0), struct nk_buffer, vertex_buffer);
  const void *vertices = nk_buffer_memory_const(vertex_buffer);
  glVertexPointer(2, GL_FLOAT, vs, (const void*)((const nk_byte*)vertices + vp));
  glTexCoordPointer(2, GL_FLOAT, vs, (const void*)((const nk_byte*)vertices + vt));
  glColorPointer(4, GL_UNSIGNED_BYTE, vs, (const void*)((const nk_byte*)vertices + vc));

  return result;
}