void gs_draw_sprite(texture_t tex, uint32_t flip, uint32_t width, uint32_t height) { graphics_t graphics = thread_graphics; float fcx, fcy; struct vb_data *data; assert(tex); if (gs_gettexturetype(tex) != GS_TEXTURE_2D) { blog(LOG_ERROR, "A sprite must be a 2D texture"); return; } fcx = width ? (float)width : (float)texture_getwidth(tex); fcy = height ? (float)height : (float)texture_getheight(tex); data = vertexbuffer_getdata(graphics->sprite_buffer); if (texture_isrect(tex)) build_sprite_rect(data, tex, fcx, fcy, flip); else build_sprite_norm(data, fcx, fcy, flip); vertexbuffer_flush(graphics->sprite_buffer, false); gs_load_vertexbuffer(graphics->sprite_buffer); gs_load_indexbuffer(NULL); gs_draw(GS_TRISTRIP, 0, 0); }
static bool load_texture_sampler(texture_t tex, samplerstate_t ss) { bool success = true; GLint min_filter; if (tex->cur_sampler == ss) return true; if (tex->cur_sampler) samplerstate_release(tex->cur_sampler); tex->cur_sampler = ss; if (!ss) return true; samplerstate_addref(ss); min_filter = ss->min_filter; if (texture_isrect(tex)) strip_mipmap_filter(&min_filter); if (!gl_tex_param_i(tex->gl_target, GL_TEXTURE_MIN_FILTER, min_filter)) success = false; if (!gl_tex_param_i(tex->gl_target, GL_TEXTURE_MAG_FILTER, ss->mag_filter)) success = false; if (!gl_tex_param_i(tex->gl_target, GL_TEXTURE_WRAP_S, ss->address_u)) success = false; if (!gl_tex_param_i(tex->gl_target, GL_TEXTURE_WRAP_T, ss->address_v)) success = false; if (!gl_tex_param_i(tex->gl_target, GL_TEXTURE_WRAP_R, ss->address_w)) success = false; if (!gl_tex_param_i(tex->gl_target, GL_TEXTURE_MAX_ANISOTROPY_EXT, ss->max_anisotropy)) success = false; apply_swizzle(tex); return success; }