diff --git a/doc/includes/references.h b/doc/includes/references.h index 3fe050c7..ec3bd3cd 100644 --- a/doc/includes/references.h +++ b/doc/includes/references.h @@ -1338,7 +1338,11 @@ typedef enum mjtGridPos_ { // grid position for overlay mjGRID_TOPLEFT = 0, // top left mjGRID_TOPRIGHT, // top right mjGRID_BOTTOMLEFT, // bottom left - mjGRID_BOTTOMRIGHT // bottom right + mjGRID_BOTTOMRIGHT, // bottom right + mjGRID_TOP, // top center + mjGRID_BOTTOM, // bottom center + mjGRID_LEFT, // left center + mjGRID_RIGHT // right center } mjtGridPos; typedef enum mjtFramebuffer_ { // OpenGL framebuffer option mjFB_WINDOW = 0, // default/window buffer diff --git a/include/mujoco/mjrender.h b/include/mujoco/mjrender.h index fb37d926..4b417c15 100644 --- a/include/mujoco/mjrender.h +++ b/include/mujoco/mjrender.h @@ -30,7 +30,11 @@ typedef enum mjtGridPos_ { // grid position for overlay mjGRID_TOPLEFT = 0, // top left mjGRID_TOPRIGHT, // top right mjGRID_BOTTOMLEFT, // bottom left - mjGRID_BOTTOMRIGHT // bottom right + mjGRID_BOTTOMRIGHT, // bottom right + mjGRID_TOP, // top center + mjGRID_BOTTOM, // bottom center + mjGRID_LEFT, // left center + mjGRID_RIGHT // right center } mjtGridPos; diff --git a/introspect/enums.py b/introspect/enums.py index fbee5402..7760d68d 100644 --- a/introspect/enums.py +++ b/introspect/enums.py @@ -610,6 +610,10 @@ ENUMS: Mapping[str, EnumDecl] = dict([ ('mjGRID_TOPRIGHT', 1), ('mjGRID_BOTTOMLEFT', 2), ('mjGRID_BOTTOMRIGHT', 3), + ('mjGRID_TOP', 4), + ('mjGRID_BOTTOM', 5), + ('mjGRID_LEFT', 6), + ('mjGRID_RIGHT', 7), ]), )), ('mjtFramebuffer', diff --git a/simulate/simulate.cc b/simulate/simulate.cc index a20fe6e7..3d2c96d4 100644 --- a/simulate/simulate.cc +++ b/simulate/simulate.cc @@ -2185,7 +2185,7 @@ void Simulate::Render() { // label if (this->loadrequest) { - mjr_overlay(mjFONT_BIG, mjGRID_TOPLEFT, smallrect, "loading", nullptr, + mjr_overlay(mjFONT_BIG, mjGRID_TOP, smallrect, "LOADING...", nullptr, &this->platform_ui->mjr_context()); } else { char intro_message[Simulate::kMaxFilenameLength]; @@ -2283,10 +2283,11 @@ void Simulate::Render() { &this->platform_ui->mjr_context()); } - // make pause/loading label - std::string pauseloadlabel; + // show pause/loading label if (!this->run || this->loadrequest) { - pauseloadlabel = this->loadrequest ? "loading" : "pause"; + const char* label = this->loadrequest ? "LOADING..." : "PAUSE"; + mjr_overlay(mjFONT_BIG, mjGRID_TOP, smallrect, label, nullptr, + &this->platform_ui->mjr_context()); } // get desired and actual percent-of-real-time @@ -2301,22 +2302,18 @@ void Simulate::Render() { char rtlabel[30] = {'\0'}; if (desiredRealtime != 100.0 || misaligned) { // print desired realtime - int labelsize = std::snprintf(rtlabel, - sizeof(rtlabel), "%g%%", desiredRealtime); + int labelsize = std::snprintf(rtlabel, sizeof(rtlabel), "%g%%", desiredRealtime); // if misaligned, append to label if (misaligned) { - std::snprintf(rtlabel+labelsize, - sizeof(rtlabel)-labelsize, " (%-4.1f%%)", actualRealtime); + std::snprintf(rtlabel+labelsize, sizeof(rtlabel)-labelsize, " (%-4.1f%%)", actualRealtime); } } - // draw top left overlay - if (!pauseloadlabel.empty() || rtlabel[0]) { - std::string newline = !pauseloadlabel.empty() && rtlabel[0] ? "\n" : ""; - std::string topleftlabel = rtlabel + newline + pauseloadlabel; - mjr_overlay(mjFONT_BIG, mjGRID_TOPLEFT, smallrect, - topleftlabel.c_str(), nullptr, &this->platform_ui->mjr_context()); + // show real-time overlay + if (rtlabel[0]) { + mjr_overlay(mjFONT_BIG, mjGRID_TOPLEFT, smallrect, rtlabel, nullptr, + &this->platform_ui->mjr_context()); } // show ui 0 diff --git a/src/render/render_gl2.c b/src/render/render_gl2.c index 095d5b41..f655bc4e 100644 --- a/src/render/render_gl2.c +++ b/src/render/render_gl2.c @@ -479,6 +479,26 @@ static int draw_overlay(int font, mjrRect viewport, int skip, int gridpos, case mjGRID_BOTTOMRIGHT: glViewport(viewport.left+viewport.width-skip-1-PAD-W, viewport.bottom+PAD, W, H); + break; + + case mjGRID_TOP: + glViewport(viewport.left+(viewport.width-skip-W)/2-1-PAD, + viewport.bottom+viewport.height-1-PAD-H, W, H); + break; + + case mjGRID_BOTTOM: + glViewport(viewport.left+(viewport.width-skip-W)/2-1-PAD, + viewport.bottom+PAD, W, H); + break; + + case mjGRID_LEFT: + glViewport(viewport.left+skip+PAD, + viewport.bottom+(viewport.height-H)/2-1-PAD, W, H); + break; + + case mjGRID_RIGHT: + glViewport(viewport.left+viewport.width-skip-1-PAD-W, + viewport.bottom+(viewport.height-H)/2-1-PAD, W, H); } // set projection in pixels diff --git a/unity/Runtime/Bindings/MjBindings.cs b/unity/Runtime/Bindings/MjBindings.cs index ac5c8161..4dcc8420 100644 --- a/unity/Runtime/Bindings/MjBindings.cs +++ b/unity/Runtime/Bindings/MjBindings.cs @@ -384,6 +384,10 @@ public enum mjtGridPos : int{ mjGRID_TOPRIGHT = 1, mjGRID_BOTTOMLEFT = 2, mjGRID_BOTTOMRIGHT = 3, + mjGRID_TOP = 4, + mjGRID_BOTTOM = 5, + mjGRID_LEFT = 6, + mjGRID_RIGHT = 7, } public enum mjtFramebuffer : int{ mjFB_WINDOW = 0,