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; }
//先按照时间从小到大插入 void DexSkinMesh::Joint::AddKeyFrame(int32 time, const DexMatrix4x4& matrix) { m_vecKeyFrames.push_back(matrix_key(time, matrix)); }
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; }