Exemplo n.º 1
0
bool vogl_matrix_state::restore_matrix_stack(const vogl_context_info &context_info, GLenum matrix, uint32_t index) const
{
    VOGL_FUNC_TRACER

    VOGL_NOTE_UNUSED(context_info);

    const matrix_vec *pVec = m_matrices.find_value(matrix_key(matrix, index));
    if ((!pVec) || (pVec->size() < 1))
        return false;

    GL_ENTRYPOINT(glMatrixMode)(matrix);
    if (vogl_check_gl_error())
        return false;

    // deepest .. current
    // 0       1   2

    for (uint32_t i = 0; i < pVec->size(); i++)
    {
        if (i)
        {
            GL_ENTRYPOINT(glPushMatrix)();
            if (vogl_check_gl_error())
                return false;
        }

        GL_ENTRYPOINT(glLoadMatrixd)((*pVec)[i].get_ptr());
        if (vogl_check_gl_error())
            return false;
    }

    return true;
}
Exemplo n.º 2
0
//先按照时间从小到大插入
void DexSkinMesh::Joint::AddKeyFrame(int32 time, const DexMatrix4x4& matrix)
{
	m_vecKeyFrames.push_back(matrix_key(time, matrix));
}
Exemplo n.º 3
0
bool vogl_matrix_state::save_matrix_stack(const vogl_context_info &context_info, GLenum matrix, uint32_t index, GLenum depth_get, GLenum matrix_get)
{
    VOGL_FUNC_TRACER

    VOGL_NOTE_UNUSED(context_info);

    GL_ENTRYPOINT(glMatrixMode)(matrix);
    if (vogl_check_gl_error())
        return false;

    GLint depth = 0;
    GL_ENTRYPOINT(glGetIntegerv)(depth_get, &depth);
    if (vogl_check_gl_error())
    {
        // This *should* work on AMD because it supports the ARB_imaging subset on compat contexts, and it supports the GL_COLOR matrix and the max stack depth is reported as 10.
        if (depth_get == GL_COLOR_MATRIX_STACK_DEPTH)
        {
            vogl_warning_printf("Using GL_COLOR_MATRIX_STACK_DEPTH workaround for AMD drivers - this will purposely force a stack underflow!\n");

            vogl::vector<matrix44D> matrices;
            for (;;)
            {
                matrix44D mat;
                GL_ENTRYPOINT(glGetDoublev)(matrix_get, mat.get_ptr());
                if (vogl_check_gl_error())
                    return false;

                matrices.push_back(mat);

                GL_ENTRYPOINT(glPopMatrix)();
                bool failed_popping = vogl_check_gl_error();

                GL_ENTRYPOINT(glGetDoublev)(matrix_get, mat.get_ptr());
                // AMD fails with a stack underflow on the get, not the pop - at least during tracing?
                if (vogl_check_gl_error())
                    failed_popping = true;

                if (failed_popping)
                    break;
            }

            for (int i = matrices.size() - 1; i >= 0; i--)
            {
                if (i != static_cast<int>(matrices.size()) - 1)
                {
                    GL_ENTRYPOINT(glPushMatrix)();
                    if (vogl_check_gl_error())
                        return false;
                }

                GL_ENTRYPOINT(glLoadMatrixd)(matrices[i].get_ptr());
                if (vogl_check_gl_error())
                    return false;
            }

            depth = matrices.size();
        }
        else
        {
            return false;
        }
    }

    if (depth < 1)
        return false;

    matrix_vec &vec = m_matrices[matrix_key(matrix, index)];
    vec.resize(depth);

    // deepest .. current
    // 0       1   2

    for (int i = 0; i < depth; i++)
    {
        matrix44D mat;
        GL_ENTRYPOINT(glGetDoublev)(matrix_get, mat.get_ptr());
        if (vogl_check_gl_error())
            return false;

        vec[depth - 1 - i] = mat;

        if (i != (depth - 1))
        {
            GL_ENTRYPOINT(glPopMatrix)();
            if (vogl_check_gl_error())
                return false;
        }
    }

    for (int i = 1; i < depth; i++)
    {
        GL_ENTRYPOINT(glPushMatrix)();
        if (vogl_check_gl_error())
            return false;

        GL_ENTRYPOINT(glLoadMatrixd)(vec[i].get_ptr());
        if (vogl_check_gl_error())
            return false;
    }

    return true;
}