https://stackoverflow.com/questions/23204255/how-to-cast-void-to-shared-ptrmytype
glfwSetWindowUserPointer(m_window, &m_viewport);
由于glfw的callback只能是static, 所以通过设置UserPointer来传递成员变量
auto viewport = static_cast<std::shared_ptr<TJViewport>*>(glfwGetWindowUserPointer(window));
if( button == GLFW_MOUSE_BUTTON_LEFT && action == GLFW_PRESS)
(*viewport)->setState(TJViewport::TUMBLING);