Exemple #1
0
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;
}
Exemple #2
0
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;
    }
}