From 4f5da9c5549b3974e5361344c5735268f33eab37 Mon Sep 17 00:00:00 2001 From: Alessio Quaglino Date: Thu, 20 Apr 2023 04:24:57 -0700 Subject: [PATCH] Add OnePlugin read/write functions and remove redundant plugin attributes from mjCActuator. PiperOrigin-RevId: 525708657 Change-Id: I762de238f989b13877d5f9198c83c16ea9dc1d8b --- src/user/user_objects.h | 6 ---- src/xml/xml_native_reader.cc | 34 ++++++++++---------- src/xml/xml_native_reader.h | 1 + src/xml/xml_native_writer.cc | 62 +++++++++++++++--------------------- src/xml/xml_native_writer.h | 1 + 5 files changed, 44 insertions(+), 60 deletions(-) diff --git a/src/user/user_objects.h b/src/user/user_objects.h index bc90708a..43c20fdb 100644 --- a/src/user/user_objects.h +++ b/src/user/user_objects.h @@ -929,12 +929,6 @@ class mjCActuator : public mjCBase { std::string slidersite; // site defining cylinder, for slider-crank only std::string refsite; // reference site, for site transmission only - // plugin support - bool is_plugin; - std::string plugin_name; - std::string plugin_instance_name; - mjCPlugin* plugin_instance; - private: mjCActuator(mjCModel* = 0, mjCDef* = 0);// constructor void Compile(void); // compiler diff --git a/src/xml/xml_native_reader.cc b/src/xml/xml_native_reader.cc index 701b7423..4ddb3208 100644 --- a/src/xml/xml_native_reader.cc +++ b/src/xml/xml_native_reader.cc @@ -1841,15 +1841,7 @@ void mjXReader::OneActuator(XMLElement* elem, mjCActuator* pact) { } else if (type == "plugin") { - pact->is_plugin = true; - ReadAttrTxt(elem, "plugin", pact->plugin_name); - ReadAttrTxt(elem, "instance", pact->plugin_instance_name); - if (pact->plugin_instance_name.empty()) { - pact->plugin_instance = model->AddPlugin(); - } else { - model->hasImplicitPluginElem = true; - } - ReadPluginConfigs(elem, pact->plugin_instance); + OnePlugin(elem, pact); } else { // SHOULD NOT OCCUR @@ -2087,6 +2079,20 @@ void mjXReader::OneComposite(XMLElement* elem, mjCBody* pbody, mjCDef* def) { +void mjXReader::OnePlugin(XMLElement* elem, mjCBase* object) { + object->is_plugin = true; + ReadAttrTxt(elem, "plugin", object->plugin_name); + ReadAttrTxt(elem, "instance", object->plugin_instance_name); + if (object->plugin_instance_name.empty()) { + object->plugin_instance = model->AddPlugin(); + } else { + model->hasImplicitPluginElem = true; + } + ReadPluginConfigs(elem, object->plugin_instance); +} + + + //------------------ MJCF-specific sections -------------------------------------------------------- // default section parser @@ -2699,15 +2705,7 @@ void mjXReader::Body(XMLElement* section, mjCBody* pbody) { // plugin sub-element else if (name == "plugin") { - pbody->is_plugin = true; - ReadAttrTxt(elem, "plugin", pbody->plugin_name); - ReadAttrTxt(elem, "instance", pbody->plugin_instance_name); - if (pbody->plugin_instance_name.empty()) { - pbody->plugin_instance = model->AddPlugin(); - } else { - model->hasImplicitPluginElem = true; - } - ReadPluginConfigs(elem, pbody->plugin_instance); + OnePlugin(elem, pbody); } // composite sub-element diff --git a/src/xml/xml_native_reader.h b/src/xml/xml_native_reader.h index 849649b1..d72c8b29 100644 --- a/src/xml/xml_native_reader.h +++ b/src/xml/xml_native_reader.h @@ -64,6 +64,7 @@ class mjXReader : public mjXBase { void OneTendon(tinyxml2::XMLElement* elem, mjCTendon* ptendon); void OneActuator(tinyxml2::XMLElement* elem, mjCActuator* pactuator); void OneComposite(tinyxml2::XMLElement* elem, mjCBody* pbody, mjCDef* def); + void OnePlugin(tinyxml2::XMLElement* elem, mjCBase* object); mjXSchema schema; // schema used for validation mjCDef* GetClass(tinyxml2::XMLElement* section); // get default class name diff --git a/src/xml/xml_native_writer.cc b/src/xml/xml_native_writer.cc index fbfd2261..b4c21052 100644 --- a/src/xml/xml_native_writer.cc +++ b/src/xml/xml_native_writer.cc @@ -618,24 +618,7 @@ void mjXWriter::OneActuator(XMLElement* elem, mjCActuator* pact, mjCDef* def) { // plugins: write config attributes if (pact->is_plugin) { - if (!pact->plugin_instance_name.empty()) { - WriteAttrTxt(elem, "instance", pact->plugin_instance_name); - } else { - WriteAttrTxt(elem, "plugin", pact->plugin_name); - const mjpPlugin* plugin = mjp_getPluginAtSlot( - pact->plugin_instance->plugin_slot); - const char* c = &pact->plugin_instance->flattened_attributes[0]; - for (int i = 0; i < plugin->nattribute; ++i) { - std::string value(c); - if (!value.empty()) { - XMLElement* config_elem = InsertEnd(elem, "config"); - WriteAttrTxt(config_elem, "key", plugin->attributes[i]); - WriteAttrTxt(config_elem, "value", value); - c += value.size(); - } - ++c; - } - } + OnePlugin(elem, pact); } // non-plugins: write actuator parameters @@ -665,6 +648,30 @@ void mjXWriter::OneActuator(XMLElement* elem, mjCActuator* pact, mjCDef* def) { +// write plugin +void mjXWriter::OnePlugin(XMLElement* elem, mjCBase* object) { + if (!object->plugin_instance_name.empty()) { + WriteAttrTxt(elem, "instance", object->plugin_instance_name); + } else { + WriteAttrTxt(elem, "plugin", object->plugin_name); + const mjpPlugin* plugin = mjp_getPluginAtSlot( + object->plugin_instance->plugin_slot); + const char* c = &object->plugin_instance->flattened_attributes[0]; + for (int i = 0; i < plugin->nattribute; ++i) { + std::string value(c); + if (!value.empty()) { + XMLElement* config_elem = InsertEnd(elem, "config"); + WriteAttrTxt(config_elem, "key", plugin->attributes[i]); + WriteAttrTxt(config_elem, "value", value); + c += value.size(); + } + ++c; + } + } +} + + + //---------------------------------- class mjXWriter: top-level API -------------------------------- // constructor @@ -1382,24 +1389,7 @@ void mjXWriter::Body(XMLElement* elem, mjCBody* body) { // write plugin if (body->is_plugin) { - XMLElement *child = InsertEnd(elem, "plugin"); - if (!body->plugin_instance_name.empty()) { - WriteAttrTxt(child, "instance", body->plugin_instance_name); - } else { - WriteAttrTxt(child, "plugin", body->plugin_name); - const mjpPlugin* plugin = mjp_getPluginAtSlot( - body->plugin_instance->plugin_slot); - const char* c = &body->plugin_instance->flattened_attributes[0]; - for (int i = 0; i < plugin->nattribute; ++i) { - std::string value(c); - if (!value.empty()) { - WriteAttrTxt(child, std::string("plugin:") + plugin->attributes[i], - value); - c += value.size(); - } - ++c; - } - } + OnePlugin(elem, body); } // write child bodies recursively diff --git a/src/xml/xml_native_writer.h b/src/xml/xml_native_writer.h index 3cc6c492..862c4bb1 100644 --- a/src/xml/xml_native_writer.h +++ b/src/xml/xml_native_writer.h @@ -61,6 +61,7 @@ class mjXWriter : public mjXBase { void OneEquality(tinyxml2::XMLElement* elem, mjCEquality* pequality, mjCDef* def); void OneTendon(tinyxml2::XMLElement* elem, mjCTendon* ptendon, mjCDef* def); void OneActuator(tinyxml2::XMLElement* elem, mjCActuator* pactuator, mjCDef* def); + void OnePlugin(tinyxml2::XMLElement* elem, mjCBase* object); bool writingdefaults; // true during defaults write };