struct vertex_buffer* vertex_buffer_new() { struct vertex_buffer* buffer = STRUCT_NEW(vertex_buffer); glGenVertexArrays(1, &buffer->vao); glBindVertexArray(buffer->vao); glGenBuffers(1, &buffer->vbo); glBindBuffer(GL_ARRAY_BUFFER, buffer->vbo); glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); glEnableVertexAttribArray(2); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, VERTEX_SIZE, VERTEX_OFFSET_POS); glVertexAttribPointer(1, 4, GL_UNSIGNED_BYTE, GL_TRUE, VERTEX_SIZE, VERTEX_OFFSET_COLOR); glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, VERTEX_SIZE, VERTEX_OFFSET_UV); glDisableVertexAttribArray(0); glDisableVertexAttribArray(1); glDisableVertexAttribArray(2); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0); buffer->data = s_malloc(VERTEX_SIZE * MAX_OBJECTS); buffer->n_objs = 0; return buffer; }
struct sprite* sprite_new_container(struct rect* r) { struct sprite* s = STRUCT_NEW(sprite); s->type = SPRITE_TYPE_CONTAINER; sprite_init(s, r->width, r->height); sprite_set_glyph(s, r, NULL, 0); return s; }
struct sprite* sprite_new(struct sprite_frame* frame){ struct sprite* s = STRUCT_NEW(sprite); s->type = SPRITE_TYPE_PIC; sprite_init(s, frame->source_rect.width, frame->source_rect.height); sprite_set_sprite_frame(s, frame); return s; }
struct window* win_alloc() { struct window* win = STRUCT_NEW(window); win->cursor_x = 0.0f; win->cursor_y = 0.0f; win->is_touch_down = 0; return win; }
struct sprite_frame* sprite_frame_new(const char* key) { struct sprite_frame* f = STRUCT_NEW(sprite_frame); memset(f, 0, sizeof(struct sprite_frame)); int len = strlen(key); f->key = s_calloc(len+1); strcpy(f->key, key); sprite_frame_cache_add(GAME->sprite_frame_cache, f); return f; }
struct shader* shader_new() { struct shader* shader = STRUCT_NEW(shader); memset(shader->shader_programs, 0, MAX_SHADER*sizeof(GLuint)); shader_load_all(shader); set_builtin_uniform(shader->uniforms[BUILT_IN_MIX_COLOR], BUILT_IN_MIX_COLOR, UNIFORM_4F, "mix_color"); return shader; }
struct sprite* sprite_new_clip(struct rect* r) { struct sprite* s = STRUCT_NEW(sprite); s->type = SPRITE_TYPE_CLIP; sprite_init(s, r->width, r->height); sprite_set_glyph(s, r, NULL, 0); s->x = r->x; s->y = r->y; return s; }
struct render* render_new() { struct render* r = STRUCT_NEW(render); r->cur_program = 0; r->cur_tex_id = 0; r->vertex_buffer = vertex_buffer_new(); r->render_state = 0; r->shader = shader_new(); r->scissors.x = 0; r->scissors.y = 0; r->scissors.width = GAME->config.window_width; r->scissors.width = GAME->config.window_height; r->drawcall = 0; return r; }
struct anim* anim_new(struct array* sprite_frames) { struct anim* anim = STRUCT_NEW(anim); anim->interval = 1.0f/4.0f; anim->callback = NULL; anim->sprite_frames = array_copy(sprite_frames); anim->speed = 1.0f; // privates anim->__id = ++__anim_id; anim->__now = 0.0f; anim->__cur_frame = 0; anim->__total_frame = array_size(anim->sprite_frames); anim->__state = ANIM_STATE_PLAY; return anim; }
struct sprite_frame_cache* sprite_frame_cache_new() { struct sprite_frame_cache* c = STRUCT_NEW(sprite_frame_cache); c->cache = hashmapCreate(128, hash_str, hash_equal); c->nframes = 0; return c; }
struct texture_cache* texture_cache_new() { struct texture_cache* cache = STRUCT_NEW(texture_cache); cache->cache = hashmapCreate(32, hash_str, hash_equal); return cache; }