diff --git a/src/sparrowshell/sparrowshell.cpp b/src/sparrowshell/sparrowshell.cpp index 9d6abf9..d140ea7 100644 --- a/src/sparrowshell/sparrowshell.cpp +++ b/src/sparrowshell/sparrowshell.cpp @@ -21,10 +21,14 @@ const unsigned int SparrowShell::BUFFER_DISPLAYED_LINES = 15; const unsigned int SparrowShell::SCROLLBAR_PIXEL_WIDTH = 10; const float SparrowShell::SHELL_DEPTH = 10; const float SparrowShell::DEFAULT_FONT_SIZE = 16.f; +const float SparrowShell::TOGGLE_ANIMATION_DURATION = 400.f; // in milliseconds +const float SparrowShell::TOGGLE_ANIMATION_SMOOTHING_FACTOR = 6.f; // 10 = perfect smoothing, 1 = almost no smoothing SparrowShell::SparrowShell(sf::Window* window): m_buffer(new ShellBuffer(BUFFER_MAX_LENGTH)), - m_text_color(glm::vec3(0.7,1,0.3)) + m_text_color(glm::vec3(0.7,1,0.3)), + m_animationProgress(0.f), + m_isMoving(false) { sf::Vector2u size = window->getSize(); m_dimension = glm::ivec2(size.x,DEFAULT_FONT_SIZE*(BUFFER_DISPLAYED_LINES+1)); @@ -155,16 +159,36 @@ void SparrowShell::toggleShell() getEngine().getInput()->setCurrentContext("shell"); } m_shellEnabled = !m_shellEnabled; - setVisible(m_shellEnabled); + m_isMoving = true; + if(m_shellEnabled) + setVisible(true); getEngine().getWindow()->setKeyRepeatEnabled(m_shellEnabled); m_input_node->setFocus(m_shellEnabled); - // for(auto child : m_children) - // child->toggleVisibility(); -// m_buffer->toggleBuffer(); } void SparrowShell::update() { + if(m_isMoving) + { + m_animationProgress += (m_shellEnabled ? 1.f : -1.f)*(getEngine().getDeltaTime()/TOGGLE_ANIMATION_DURATION); + if(m_animationProgress > 1.f) // shell finished opening + { + m_isMoving = false; + m_animationProgress = 1.f; + } + else if(m_animationProgress < 0.f) // shell finished closing + { + m_isMoving = false; + setVisible(false); + m_animationProgress = 0.f; + } + // computing new shell position + float x = (m_animationProgress - 0.5f)*TOGGLE_ANIMATION_SMOOTHING_FACTOR; + float smoothedProgress = std::tanh(x) / std::tanh(TOGGLE_ANIMATION_SMOOTHING_FACTOR/2.f); + smoothedProgress = smoothedProgress/2.f + 0.5f; + setPosition(glm::vec2(0, (smoothedProgress-1)*m_dimension.y)); + } + if(m_shellEnabled){ auto input = getEngine().getInput(); int scroll = input->getDeltaVerticalScroll(); diff --git a/src/sparrowshell/sparrowshell.h b/src/sparrowshell/sparrowshell.h index 835df79..b23f04b 100644 --- a/src/sparrowshell/sparrowshell.h +++ b/src/sparrowshell/sparrowshell.h @@ -60,6 +60,10 @@ private: int m_move_cursor_right; std::string m_previous_context; + // toggle animation + float m_animationProgress; + bool m_isMoving; + // std::vector m_inputActions; // enum ShellAction {MOVE_CURSOR_LEFT,MOVE_CURSOR_RIGHT,HISTORY_PREVIOUS,HISTORY_NEXT}; @@ -70,6 +74,8 @@ public: static const unsigned int SCROLLBAR_PIXEL_WIDTH; static const float SHELL_DEPTH; static const float DEFAULT_FONT_SIZE; + static const float TOGGLE_ANIMATION_DURATION; + static const float TOGGLE_ANIMATION_SMOOTHING_FACTOR; SparrowShell(sf::Window*);