Uniform const& GLES_Shader::get_uniform_skin_matrix(void* data) const { Command_Stream::Render_Context* ctx = (Command_Stream::Render_Context*)data; static Uniform u(Uniform::Type::VEC4, 1); if (u.get_count() == 1) { u = Uniform(Uniform::Type::VEC4, m_max_skin_nodes * 3); } if (ctx) { QASSERT(ctx->render_job_data->node_transform_count < m_max_skin_nodes); size_t count = math::min(ctx->render_job_data->node_transform_count, m_max_skin_nodes); if (u.get_count() == count * 3) { u = Uniform(Uniform::Type::VEC4, count * 3); } for (size_t i = 0; i < count; i++) { auto const& mat = ctx->render_job_data->node_transforms[i].mat; u.set(i*3 + 0, mat.get_row(0)); u.set(i*3 + 1, mat.get_row(1)); u.set(i*3 + 2, mat.get_row(2)); } } return u; }
void GLES_Shader::upload_uniform(uint32_t id, Uniform const& u, uint8_t const* data) const { gles::Interface interf; switch (u.get_type()) { case Uniform::Type::BOOL: { boost::auto_buffer<uint8_t*, boost::store_n_bytes<64>> buffer; buffer.uninitialized_resize(u.get_data_size()); int* ibuf = (int*)buffer.data(); for (size_t i = 0, sz = u.get_count(); i < sz; i++) { ibuf[i] = ((bool*)data)[i] ? 1 : 0; } interf.iglUniform1iv(id, u.get_count(), ibuf); } break; case Uniform::Type::INT: interf.iglUniform1iv(id, u.get_count(), (int const*)data); break; case Uniform::Type::FLOAT: interf.iglUniform1fv(id, u.get_count(), (float const*)data); break; case Uniform::Type::MAT3: interf.iglUniformMatrix3fv(id, u.get_count(), gles::iGL_FALSE, (float const*)data); break; case Uniform::Type::MAT4: interf.iglUniformMatrix4fv(id, u.get_count(), gles::iGL_FALSE, (float const*)data); break; case Uniform::Type::VEC2: interf.iglUniform2fv(id, u.get_count(), (float const*)data); break; case Uniform::Type::VEC3: interf.iglUniform3fv(id, u.get_count(), (float const*)data); break; case Uniform::Type::VEC4: interf.iglUniform4fv(id, u.get_count(), (float const*)data); break; } }