void shader_init() { if (RS) return; struct render_state * rs = (struct render_state *) malloc(sizeof(*rs)); memset(rs, 0 , sizeof(*rs)); struct render_init_args RA; // todo: config these args RA.max_buffer = 128; RA.max_layout = 4; RA.max_target = 128; RA.max_texture = 256; RA.max_shader = MAX_PROGRAM; int rsz = render_size(&RA); rs->R = (struct render *)malloc(rsz); rs->R = render_init(&RA, rs->R, rsz); texture_initrender(rs->R); screen_initrender(rs->R); label_initrender(rs->R); lsprite_initrender(rs->R); renderbuffer_initrender(rs->R); rs->current_program = -1; rs->blendchange = 0; render_setblend(rs->R, BLEND_ONE, BLEND_ONE_MINUS_SRC_ALPHA); uint16_t idxs[6 * MAX_COMMBINE]; int i; for (i=0;i<MAX_COMMBINE;i++) { idxs[i*6] = i*4; idxs[i*6+1] = i*4+1; idxs[i*6+2] = i*4+2; idxs[i*6+3] = i*4; idxs[i*6+4] = i*4+2; idxs[i*6+5] = i*4+3; } rs->index_buffer = render_buffer_create(rs->R, INDEXBUFFER, idxs, 6 * MAX_COMMBINE, sizeof(uint16_t)); rs->vertex_buffer = render_buffer_create(rs->R, VERTEXBUFFER, NULL, 4 * MAX_COMMBINE, sizeof(struct vertex)); struct vertex_attrib va[4] = { { "position", 0, 2, sizeof(float), BUFFER_OFFSET(vp.vx) }, { "texcoord", 0, 2, sizeof(uint16_t), BUFFER_OFFSET(vp.tx) }, { "color", 0, 4, sizeof(uint8_t), BUFFER_OFFSET(rgba) }, { "additive", 0, 4, sizeof(uint8_t), BUFFER_OFFSET(add) }, }; rs->layout = render_register_vertexlayout(rs->R, sizeof(va)/sizeof(va[0]), va); render_set(rs->R, VERTEXLAYOUT, rs->layout, 0); render_set(rs->R, INDEXBUFFER, rs->index_buffer, 0); render_set(rs->R, VERTEXBUFFER, rs->vertex_buffer, 0); RS = rs; }
void renderbuffer_upload(struct render_buffer *rb) { if (rb->vbid == 0) { rb->vbid = render_buffer_create(R, VERTEXBUFFER, rb->vb, rb->object * 4, sizeof(struct vertex)); } else { render_buffer_update(R, rb->vbid, rb->vb, rb->object * 4); } }