added smooth animation for shell toggle

This commit is contained in:
Anselme 2017-10-15 12:26:06 +02:00
parent 08fda5a62c
commit fa0d75976f
2 changed files with 35 additions and 5 deletions

View File

@ -21,10 +21,14 @@ const unsigned int SparrowShell::BUFFER_DISPLAYED_LINES = 15;
const unsigned int SparrowShell::SCROLLBAR_PIXEL_WIDTH = 10; const unsigned int SparrowShell::SCROLLBAR_PIXEL_WIDTH = 10;
const float SparrowShell::SHELL_DEPTH = 10; const float SparrowShell::SHELL_DEPTH = 10;
const float SparrowShell::DEFAULT_FONT_SIZE = 16.f; 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): SparrowShell::SparrowShell(sf::Window* window):
m_buffer(new ShellBuffer(BUFFER_MAX_LENGTH)), 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(); sf::Vector2u size = window->getSize();
m_dimension = glm::ivec2(size.x,DEFAULT_FONT_SIZE*(BUFFER_DISPLAYED_LINES+1)); m_dimension = glm::ivec2(size.x,DEFAULT_FONT_SIZE*(BUFFER_DISPLAYED_LINES+1));
@ -155,16 +159,36 @@ void SparrowShell::toggleShell()
getEngine().getInput()->setCurrentContext("shell"); getEngine().getInput()->setCurrentContext("shell");
} }
m_shellEnabled = !m_shellEnabled; m_shellEnabled = !m_shellEnabled;
setVisible(m_shellEnabled); m_isMoving = true;
if(m_shellEnabled)
setVisible(true);
getEngine().getWindow()->setKeyRepeatEnabled(m_shellEnabled); getEngine().getWindow()->setKeyRepeatEnabled(m_shellEnabled);
m_input_node->setFocus(m_shellEnabled); m_input_node->setFocus(m_shellEnabled);
// for(auto child : m_children)
// child->toggleVisibility();
// m_buffer->toggleBuffer();
} }
void SparrowShell::update() 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){ if(m_shellEnabled){
auto input = getEngine().getInput(); auto input = getEngine().getInput();
int scroll = input->getDeltaVerticalScroll(); int scroll = input->getDeltaVerticalScroll();

View File

@ -60,6 +60,10 @@ private:
int m_move_cursor_right; int m_move_cursor_right;
std::string m_previous_context; std::string m_previous_context;
// toggle animation
float m_animationProgress;
bool m_isMoving;
// std::vector<int> m_inputActions; // std::vector<int> m_inputActions;
// enum ShellAction {MOVE_CURSOR_LEFT,MOVE_CURSOR_RIGHT,HISTORY_PREVIOUS,HISTORY_NEXT}; // 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 unsigned int SCROLLBAR_PIXEL_WIDTH;
static const float SHELL_DEPTH; static const float SHELL_DEPTH;
static const float DEFAULT_FONT_SIZE; static const float DEFAULT_FONT_SIZE;
static const float TOGGLE_ANIMATION_DURATION;
static const float TOGGLE_ANIMATION_SMOOTHING_FACTOR;
SparrowShell(sf::Window*); SparrowShell(sf::Window*);