added smooth animation for shell toggle
This commit is contained in:
parent
08fda5a62c
commit
fa0d75976f
@ -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();
|
||||
|
@ -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<int> 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*);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user