void shader_drawbuffer(struct render_buffer * rb, float tx, float ty, float scale) { rs_commit(); RID glid = texture_glid(rb->texid); if (glid == 0) return; shader_texture(glid, 0); render_set(RS->R, VERTEXBUFFER, rb->vbid, 0); float sx = scale; float sy = scale; screen_trans(&sx, &sy); screen_trans(&tx, &ty); float v[4] = { sx, sy, tx, ty }; // we should call shader_adduniform to add "st" uniform first shader_setuniform(PROGRAM_RENDERBUFFER, 0, UNIFORM_FLOAT4, v); shader_program(PROGRAM_RENDERBUFFER, NULL); RS->drawcall++; renderbuffer_commit(rb); render_set(RS->R, VERTEXBUFFER, RS->vertex_buffer, 0); }
static int luniform_set(lua_State *L) { int prog = luaL_checkinteger(L, 1); shader_program(prog); int index = luaL_checkinteger(L, 2); enum UNIFORM_FORMAT t = luaL_checkinteger(L, 3); float v[16]; // 16 is matrix 4x4 int n = 0; switch(t) { case UNIFORM_FLOAT1: n = 1; break; case UNIFORM_FLOAT2: n = 2; break; case UNIFORM_FLOAT3: n = 3; break; case UNIFORM_FLOAT4: n = 4; break; case UNIFORM_FLOAT33: n = 9; break; case UNIFORM_FLOAT44: n = 16; break; default: return luaL_error(L, "Invalid uniform format %d", t); break; } int top = lua_gettop(L); if (top != n + 3) { return luaL_error(L, "Need float %d, only %d passed", n, top - 3); } int i; for (i=0;i<n;i++) { v[i] = luaL_checknumber(L, 4+i); } shader_setuniform(index, t, v); return 0; }