First pass at mjSpec Explorer and Properties windows.
Displays the list of bodies and joints from the mjSpec and displays values for the selected element. Functionality is very limited and a bit non-intuitive. However, we want to get this into our users hands to start getting feedback. PiperOrigin-RevId: 842228895 Change-Id: I2491cd5e0acaf622110e0f6b8406919024d3607a
This commit is contained in:
committed by
Copybara-Service
parent
c064abc3da
commit
97eb307ce9
@@ -33,8 +33,8 @@ namespace mujoco::platform {
|
||||
static constexpr int kToolsBarHeight = 48;
|
||||
static constexpr int kStatusBarHeight = 32;
|
||||
static constexpr float kOptionsRelWidth = 0.22f;
|
||||
static constexpr float kInspectorRelWidth = 0.18f;
|
||||
static constexpr float kInfoRelHeight = 0.3f;
|
||||
static constexpr float kInspectorRelWidth = 0.22f;
|
||||
static constexpr float kStatsRelHeight = 0.3f;
|
||||
|
||||
static ImVec2 GetFlexElementSize(int num_cols) {
|
||||
const float width = (ImGui::GetContentRegionAvail().x / num_cols) -
|
||||
@@ -83,14 +83,20 @@ ImVec4 ConfigureDockingLayout() {
|
||||
ImGui::DockBuilderSplitNode(main, ImGuiDir_Right, kInspectorRelWidth,
|
||||
&inspector, &main);
|
||||
|
||||
ImGuiID info = 0;
|
||||
ImGui::DockBuilderSplitNode(inspector, ImGuiDir_Down, kInfoRelHeight,
|
||||
&info, &inspector);
|
||||
ImGuiID stats = 0;
|
||||
ImGui::DockBuilderSplitNode(options, ImGuiDir_Down, kStatsRelHeight,
|
||||
&stats, &options);
|
||||
|
||||
ImGuiID properties = 0;
|
||||
ImGui::DockBuilderSplitNode(inspector, ImGuiDir_Down, kStatsRelHeight,
|
||||
&properties, &inspector);
|
||||
|
||||
ImGui::DockBuilderDockWindow("Dockspace", main);
|
||||
ImGui::DockBuilderDockWindow("Options", options);
|
||||
ImGui::DockBuilderDockWindow("Explorer", inspector);
|
||||
ImGui::DockBuilderDockWindow("Inspector", inspector);
|
||||
ImGui::DockBuilderDockWindow("Info", info);
|
||||
ImGui::DockBuilderDockWindow("Properties", properties);
|
||||
ImGui::DockBuilderDockWindow("Stats", stats);
|
||||
ImGui::DockBuilderFinish(root);
|
||||
}
|
||||
|
||||
@@ -848,7 +854,8 @@ void CountsGui(const mjModel* model, mjData* data) {
|
||||
}
|
||||
}
|
||||
|
||||
void InfoGui(const mjModel* model, const mjData* data, bool paused, float fps) {
|
||||
void StatsGui(const mjModel* model, const mjData* data, bool paused,
|
||||
float fps) {
|
||||
const int num_islands = std::clamp(data->nisland, 1, mjNISLAND);
|
||||
|
||||
// compute solver error (maximum over islands)
|
||||
@@ -916,4 +923,111 @@ void InfoGui(const mjModel* model, const mjData* data, bool paused, float fps) {
|
||||
ImGui::Columns();
|
||||
}
|
||||
|
||||
void BodyPropertiesGui(const mjModel* model, const mjData* data,
|
||||
mjsElement* element, int id) {
|
||||
const mjsBody* body = mjs_asBody(element);
|
||||
|
||||
ImGui::Columns(2);
|
||||
ImGui::SetColumnWidth(0, ImGui::GetWindowWidth() * 0.4f);
|
||||
ImGui::SetColumnWidth(1, ImGui::GetWindowWidth() * 0.6f);
|
||||
|
||||
std::string name = *mjs_getName(body->element);
|
||||
if (name.empty()) {
|
||||
name = "(Body " + std::to_string(id) + ")";
|
||||
}
|
||||
|
||||
ImGui::Columns(2);
|
||||
ImGui::SetColumnWidth(0, ImGui::GetWindowWidth() * 0.3f);
|
||||
ImGui::SetColumnWidth(1, ImGui::GetWindowWidth() * 0.7f);
|
||||
|
||||
ImGui::Text("Name");
|
||||
ImGui::Text("xpos[0]");
|
||||
ImGui::Text("xpos[1]");
|
||||
ImGui::Text("xpos[2]");
|
||||
ImGui::Text("xquat[0]");
|
||||
ImGui::Text("xquat[1]");
|
||||
ImGui::Text("xquat[2]");
|
||||
ImGui::Text("xquat[3]");
|
||||
ImGui::Text("mass");
|
||||
|
||||
ImGui::NextColumn();
|
||||
ImGui::Text("%s", name.c_str());
|
||||
ImGui::Text("%f", data->xpos[3*id+0]);
|
||||
ImGui::Text("%f", data->xpos[3*id+1]);
|
||||
ImGui::Text("%f", data->xpos[3*id+2]);
|
||||
ImGui::Text("%f", data->xquat[4*id+0]);
|
||||
ImGui::Text("%f", data->xquat[4*id+1]);
|
||||
ImGui::Text("%f", data->xquat[4*id+2]);
|
||||
ImGui::Text("%f", data->xquat[4*id+3]);
|
||||
ImGui::Text("%f", model->body_mass[id]);
|
||||
}
|
||||
|
||||
void JointPropertiesGui(const mjModel* model, const mjData* data,
|
||||
mjsElement* element, int id) {
|
||||
const mjsJoint* joint = mjs_asJoint(element);
|
||||
|
||||
ImGui::Columns(2);
|
||||
ImGui::SetColumnWidth(0, ImGui::GetWindowWidth() * 0.4f);
|
||||
ImGui::SetColumnWidth(1, ImGui::GetWindowWidth() * 0.6f);
|
||||
|
||||
std::string name = *mjs_getName(joint->element);
|
||||
if (name.empty()) {
|
||||
name = "(Joint " + std::to_string(id) + ")";
|
||||
}
|
||||
|
||||
ImGui::Columns(2);
|
||||
ImGui::SetColumnWidth(0, ImGui::GetWindowWidth() * 0.3f);
|
||||
ImGui::SetColumnWidth(1, ImGui::GetWindowWidth() * 0.7f);
|
||||
ImGui::Text("Name");
|
||||
|
||||
ImGui::NextColumn();
|
||||
ImGui::Text("%s", name.c_str());
|
||||
}
|
||||
|
||||
void SitePropertiesGui(const mjModel* model, const mjData* data,
|
||||
mjsElement* element, int id) {
|
||||
const mjsSite* site = mjs_asSite(element);
|
||||
|
||||
ImGui::Columns(2);
|
||||
ImGui::SetColumnWidth(0, ImGui::GetWindowWidth() * 0.4f);
|
||||
ImGui::SetColumnWidth(1, ImGui::GetWindowWidth() * 0.6f);
|
||||
|
||||
std::string name = *mjs_getName(site->element);
|
||||
if (name.empty()) {
|
||||
name = "(Joint " + std::to_string(id) + ")";
|
||||
}
|
||||
|
||||
ImGui::Columns(2);
|
||||
ImGui::SetColumnWidth(0, ImGui::GetWindowWidth() * 0.3f);
|
||||
ImGui::SetColumnWidth(1, ImGui::GetWindowWidth() * 0.7f);
|
||||
ImGui::Text("Name");
|
||||
ImGui::Text("site_xpos[0]");
|
||||
ImGui::Text("site_xpos[1]");
|
||||
ImGui::Text("site_xpos[2]");
|
||||
ImGui::Text("site_xmat[0]");
|
||||
ImGui::Text("site_xmat[1]");
|
||||
ImGui::Text("site_xmat[2]");
|
||||
ImGui::Text("site_xmat[3]");
|
||||
ImGui::Text("site_xmat[4]");
|
||||
ImGui::Text("site_xmat[5]");
|
||||
ImGui::Text("site_xmat[6]");
|
||||
ImGui::Text("site_xmat[7]");
|
||||
ImGui::Text("site_xmat[8]");
|
||||
|
||||
ImGui::NextColumn();
|
||||
ImGui::Text("%s", name.c_str());
|
||||
ImGui::Text("%f", data->site_xpos[3*id+0]);
|
||||
ImGui::Text("%f", data->site_xpos[3*id+1]);
|
||||
ImGui::Text("%f", data->site_xpos[3*id+2]);
|
||||
ImGui::Text("%f", data->site_xmat[4*id+0]);
|
||||
ImGui::Text("%f", data->site_xmat[4*id+1]);
|
||||
ImGui::Text("%f", data->site_xmat[4*id+2]);
|
||||
ImGui::Text("%f", data->site_xmat[4*id+3]);
|
||||
ImGui::Text("%f", data->site_xmat[4*id+4]);
|
||||
ImGui::Text("%f", data->site_xmat[4*id+5]);
|
||||
ImGui::Text("%f", data->site_xmat[4*id+6]);
|
||||
ImGui::Text("%f", data->site_xmat[4*id+7]);
|
||||
ImGui::Text("%f", data->site_xmat[4*id+8]);
|
||||
}
|
||||
|
||||
} // namespace mujoco::platform
|
||||
|
||||
@@ -49,8 +49,13 @@ void SetupTheme(GuiTheme theme);
|
||||
// are used to configure the simulation (e.g. PhysicsGui).
|
||||
// "Inspector": resizable section of the right; designed for inspecting
|
||||
// or manipulating mjData elements (e.g. ControlsGui).
|
||||
// "Info": resizable section below the inspector; designed for displaying
|
||||
// basic simulation information (e.g. InfoGui); hidden by default.
|
||||
// "Explorer": secondary tab connected to the Inspector; designed for
|
||||
// displaying the tree of mjSpec elements.
|
||||
// "Stats": resizable section below the options; designed for displaying
|
||||
// basic simulation statistics (e.g. StatsGui); hidden by default.
|
||||
// "Properties": resizable section below the explorer; designed for displaying
|
||||
// properties of mjSpec elements (e.g. BodyPropertiesGui); hidden by
|
||||
// default.
|
||||
//
|
||||
// Returns the size and position of the remaining workspace area which can then
|
||||
// be used to place additional elements (e.g. floating charts).
|
||||
@@ -108,7 +113,15 @@ void CountsGui(const mjModel* model, mjData* data);
|
||||
|
||||
// UX for displaying basic simulation information. Note that the pause state and
|
||||
// FPS needs to be tracked by the caller and passed here to be displayed.
|
||||
void InfoGui(const mjModel* model, const mjData* data, bool paused, float fps);
|
||||
void StatsGui(const mjModel* model, const mjData* data, bool paused, float fps);
|
||||
|
||||
// UX for displaying properties of various mjSpec elements.
|
||||
void BodyPropertiesGui(const mjModel* model, const mjData* data,
|
||||
mjsElement* element, int id);
|
||||
void JointPropertiesGui(const mjModel* model, const mjData* data,
|
||||
mjsElement* element, int id);
|
||||
void SitePropertiesGui(const mjModel* model, const mjData* data,
|
||||
mjsElement* element, int id);
|
||||
|
||||
} // namespace mujoco::platform
|
||||
|
||||
|
||||
Reference in New Issue
Block a user