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;
}
|