diff --git a/include/openspace/interaction/luaconsole.h b/include/openspace/interaction/luaconsole.h index 82875241be..94720bfde8 100644 --- a/include/openspace/interaction/luaconsole.h +++ b/include/openspace/interaction/luaconsole.h @@ -53,7 +53,9 @@ public: bool keyboardCallback(Key key, KeyModifier modifier, KeyAction action); void charCallback(unsigned int codepoint, KeyModifier modifier); + void update(); void render(); + float currentHeight() const; private: void parallelConnectionChanged(const ParallelConnection::Status& status); @@ -81,7 +83,9 @@ private: std::string initialValue; } _autoCompleteInfo; + float _targetHeight; float _currentHeight; + float _fullHeight; std::shared_ptr _font; std::shared_ptr _historyFont; diff --git a/openspace.cfg b/openspace.cfg index 5bba443950..16ee725a07 100644 --- a/openspace.cfg +++ b/openspace.cfg @@ -51,7 +51,8 @@ return { }, Fonts = { Mono = "${FONTS}/Droid_Sans_Mono/DroidSansMono.ttf", - Light = "${FONTS}/Roboto/Roboto-Regular.ttf" + Light = "${FONTS}/Roboto/Roboto-Regular.ttf", + Console = "${FONTS}/Inconsolata/Inconsolata-Regular.ttf" }, Logging = { -- LogLevel = "Trace", diff --git a/src/engine/openspaceengine.cpp b/src/engine/openspaceengine.cpp index 5c00d847f4..118d2f7ea7 100644 --- a/src/engine/openspaceengine.cpp +++ b/src/engine/openspaceengine.cpp @@ -1075,17 +1075,24 @@ void OpenSpaceEngine::render(const glm::mat4& sceneMatrix, const glm::mat4& viewMatrix, const glm::mat4& projectionMatrix) { + + bool isGuiWindow = _windowWrapper->hasGuiWindow() ? _windowWrapper->isGuiWindow() : true; + bool showOverlay = isGuiWindow && _windowWrapper->isMaster() && _windowWrapper->isRegularRendering(); + // @CLEANUP: Replace the two windows by a single call to whether a gui should be + // rendered ---abock + + if (showOverlay) { + _console->update(); + } + LTRACE("OpenSpaceEngine::render(begin)"); _renderEngine->render(sceneMatrix, viewMatrix, projectionMatrix); for (const auto& func : _moduleCallbacks.render) { func(); } - - // @CLEANUP: Replace the two windows by a single call to whether a gui should be - // rendered ---abock - bool showGui = _windowWrapper->hasGuiWindow() ? _windowWrapper->isGuiWindow() : true; - if (showGui && _windowWrapper->isMaster() && _windowWrapper->isRegularRendering()) { + + if (showOverlay) { _renderEngine->renderScreenLog(); _console->render(); } diff --git a/src/interaction/luaconsole.cpp b/src/interaction/luaconsole.cpp index 88825459b1..593fe7ff87 100644 --- a/src/interaction/luaconsole.cpp +++ b/src/interaction/luaconsole.cpp @@ -65,8 +65,8 @@ namespace { // Additional space between the entry text and the history (in pixels) const float SeparatorSpace = 30.f; - // Determines at which speed the console opens (in pixels/second) - const float ConsoleOpenSpeed = 500.f; + // Determines at which speed the console opens. + const float ConsoleOpenSpeed = 0.5; } // namespace @@ -79,21 +79,21 @@ LuaConsole::LuaConsole() , _backgroundColor( "backgroundColor", "Background Color", - glm::vec4(41.f / 255.f, 41.f / 255.f, 41.f / 255.f, 1.f), + glm::vec4(21.f / 255.f, 23.f / 255.f, 28.f / 255.f, 0.8f), glm::vec4(0.f), glm::vec4(1.f) ) , _highlightColor( "highlightColor", "Highlight Color", - glm::vec4(1.f, 1.f, 1.f, 0.8f), + glm::vec4(1.f, 1.f, 1.f, 0.f), glm::vec4(0.f), glm::vec4(1.f) ) , _separatorColor( "separatorColor", "Separator Color", - glm::vec4(0.4f, 0.4f, 0.4f, 1.f), + glm::vec4(0.4f, 0.4f, 0.4f, 0.f), glm::vec4(0.f), glm::vec4(1.f) ) @@ -107,7 +107,7 @@ LuaConsole::LuaConsole() , _historyTextColor( "historyTextColor", "History Text Color", - glm::vec4(0.65f, 0.65f, 0.65f, 1.f), + glm::vec4(1.0f, 1.0f, 1.0f, 0.65f), glm::vec4(0.f), glm::vec4(1.f) ) @@ -116,6 +116,8 @@ LuaConsole::LuaConsole() , _activeCommand(0) , _autoCompleteInfo({NoAutoComplete, false, ""}) , _currentHeight(0.f) + , _targetHeight(0.f) + , _fullHeight(0.f) { addProperty(_isVisible); addProperty(_remoteScripting); @@ -529,17 +531,38 @@ void LuaConsole::charCallback(unsigned int codepoint, KeyModifier modifier) { addToCommand(std::string(1, static_cast(codepoint))); } +void LuaConsole::update() { + // Compute the height by simulating _historyFont number of lines and checking + // what the bounding box for that text would be. + using namespace ghoul::fontrendering; + size_t nLines = std::min(static_cast(_historyLength), _commandsHistory.size()); + const auto bbox = FontRenderer::defaultRenderer().boundingBox( + *_historyFont, + std::string(nLines, '\n').c_str() + ); + + // Update the full height and the target height. + // Add the height of the entry line and space for a separator. + _fullHeight = (bbox.boundingBox.y + EntryFontSize + SeparatorSpace); + _targetHeight = _isVisible ? _fullHeight : 0; + + const float frametime = static_cast(OsEng.windowWrapper().averageDeltaTime()); + + // Update the current height. + // The current height is the offset that is used to slide + // the console in from the top. + const glm::ivec2 res = OsEng.windowWrapper().currentWindowResolution(); + _currentHeight += (_targetHeight - _currentHeight)*std::pow(0.98, 1.0 / (ConsoleOpenSpeed * frametime)); + _currentHeight = std::max(0.0f, _currentHeight); + _currentHeight = std::min(static_cast(res.y), _currentHeight); +} + + void LuaConsole::render() { using namespace ghoul::fontrendering; - // The scrolling of the window is done by offsetting the entire rendering's y - // coordinate upwards and slowly decreasing that value. Since the rendering is going - // to be clipped, we don't need to take care about not rendering parts that are off - // screen - - if (!_isVisible) { - // When we toggle the console back to visible, we want to start at 0 height - _currentHeight = 0.f; + // Don't render the console if it's collapsed. + if (_currentHeight < 1.0f) { return; } @@ -549,26 +572,6 @@ void LuaConsole::render() { const glm::ivec2 res = OsEng.windowWrapper().currentWindowResolution(); - // Compute the maximum height by simulating _historyFont number of lines and checking - // what the bounding box for that text would be - const auto bbox = FontRenderer::defaultRenderer().boundingBox( - *_historyFont, - std::string(_historyLength, '\n').c_str() - ); - - // Add the height of the entry line and space for a separator - const float MaximumHeight = (bbox.boundingBox.y + EntryFontSize + SeparatorSpace); - - // Update the current height. The current height is the offset that is used to slide - // the console in from the top - const float frametime = static_cast(OsEng.windowWrapper().averageDeltaTime()); - _currentHeight += ConsoleOpenSpeed * frametime; - _currentHeight = std::min(_currentHeight, MaximumHeight); - - // Since _currentHeight is going from [0, MaximumHeight], we invert it here so the - // rendering initially starts outside the frame and blends in - const float h = MaximumHeight - _currentHeight; - // Render background glDisable(GL_CULL_FACE); glEnable(GL_BLEND); @@ -579,12 +582,12 @@ void LuaConsole::render() { _program->setUniform("res", res); _program->setUniform("color", _backgroundColor); - _program->setUniform("height", MaximumHeight / res.y); + _program->setUniform("height", _currentHeight / res.y); _program->setUniform( "ortho", glm::ortho( 0.f, static_cast(res.x), 0.f, static_cast(res.y) - ) * glm::translate(glm::mat4(1.f), glm::vec3(0.f, h, 0.f)) + ) ); // Draw the background color @@ -597,7 +600,7 @@ void LuaConsole::render() { // Draw the separator between the current entry box and the history _program->setUniform("color", _separatorColor); - _program->setUniform("height", MaximumHeight / res.y - 2.5f * EntryFontSize / res.y); + _program->setUniform("height", _currentHeight / res.y - 2.5f * EntryFontSize / res.y); glDrawArrays(GL_LINES, 1, 2); _program->deactivate(); @@ -610,7 +613,7 @@ void LuaConsole::render() { glm::vec2 inputLocation = glm::vec2( EntryFontSize / 2.f, - res.y - MaximumHeight + EntryFontSize + h + res.y - _currentHeight + EntryFontSize ); // Render the current command @@ -635,7 +638,7 @@ void LuaConsole::render() { glm::vec2 historyInputLocation = glm::vec2( HistoryFontSize / 2.f, - res.y - HistoryFontSize * 1.5f + h + res.y - HistoryFontSize * 1.5f + _fullHeight - _currentHeight ); // @CPP17: Replace with array_view @@ -666,7 +669,7 @@ void LuaConsole::render() { glm::vec2 loc = glm::vec2( EntryFontSize / 2.f, - res.y - MaximumHeight + EntryFontSize + h + res.y - _currentHeight + EntryFontSize ); auto bbox = FontRenderer::defaultRenderer().boundingBox(*_font, text.c_str()); @@ -679,47 +682,32 @@ void LuaConsole::render() { if (_remoteScripting) { const glm::vec4 red(1, 0, 0, 1); - int nClients = OsEng.parallelConnection().nConnections() - 1; + int nClients = 0; + if (OsEng.parallelConnection().status() != ParallelConnection::Status::Disconnected) { + OsEng.parallelConnection().nConnections() - 1; + } + + std::string nClientsText; if (nClients == 1) { - const glm::vec2 loc = locationForRightJustifiedText( - "Broadcasting script to 1 client" - ); - - RenderFont( - *_font, - loc, - red, - "Broadcasting script to 1 client" - ); + nClientsText = "Broadcasting script to 1 client"; + } else { + nClientsText = "Broadcasting script to " + std::to_string(nClients) + " clients"; } - else { - const glm::vec2 loc = locationForRightJustifiedText( - "Broadcasting script to " + std::to_string(nClients) + " clients" - ); - RenderFont( - *_font, - loc, - red, - ("Broadcasting script to " + std::to_string(nClients) + " clients").c_str() - ); - } + const glm::vec2 loc = locationForRightJustifiedText(nClientsText); + RenderFont(*_font, loc, red, nClientsText.c_str()); + } else if (OsEng.parallelConnection().isHost()) { + const glm::vec4 lightBlue(0.4, 0.4, 1, 1); + + const std::string localExecutionText = "Local script execution"; + const glm::vec2 loc = locationForRightJustifiedText(localExecutionText); + RenderFont(*_font, loc, lightBlue, localExecutionText.c_str()); } - else { - if (OsEng.parallelConnection().isHost()) { - const glm::vec4 lightBlue(0.4, 0.4, 1, 1); - const glm::vec2 loc = locationForRightJustifiedText( - "Local script execution" - ); +} - RenderFont( - *_font, - loc, - lightBlue, - "Local script execution" - ); - } - } +float LuaConsole::currentHeight() const +{ + return _currentHeight; } void LuaConsole::addToCommand(std::string c) { diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index d78da44f53..4d63dd0a57 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -42,6 +42,7 @@ #include #include +#include #include #include #include @@ -826,6 +827,8 @@ void RenderEngine::renderInformation() { //OsEng.windowWrapper().viewportPixelCoordinates().w ); + penPosition.y -= OsEng.console().currentHeight(); + if (_showDate && _fontDate) { penPosition.y -= _fontDate->height(); RenderFontCr(